#include<iostream>
#include<memory>
#include"Route.hpp"
#include"UdpServer.hpp"//网络通信的功能
#include"ThreadPool.hpp"


using namespace ThreadPoolModule;
std::string defaulthandler(const std::string& message)
{
    std::string hello="hello,";
    hello+=message;
    return hello;
}

//1.翻译系统，字符串当成英文单词，把英文单词翻译成汉语
//2.基于文件来做


using task_t=std::function<void ()>;


//启动服务器
// ./udpserver 127.0.0.1 8888
int main(int argc, char* argv[])
{
    //if(argc!=3)
    if(argc!=2)
    {
        //如果我们的命令行参数的个数不足3个的话，那么我们就得提醒下用户输入ip和端口
        std::cerr<<"Usage: "<<argv[0]<<"port"<<std::endl;
        return 1;
    }
    //string ip=argv[1];//ip信息
    uint16_t port=std::stoi(argv[1]);//将字符串转换为整数---端口信息

    Enable_Console_Log_Strategy(); // 开启控制台日志策略

    //1.路由
    Route r;

    //2.线程池
    //GetInstance就是单例模式的获取实例函数
    auto tp=ThreadPool<task_t>::GetInstance(); // 创建一个线程池，创建出来就自动进行初始化操作了
    //3.创建一个网络服务器对象，提供通信功能
    //我们这里的UdpServer一但收到了对应的数据，他应该执行我们所绑定的方法，而这个绑定方法本质就是往线程池中入任务
    std::unique_ptr<UdpServer> usvr=std::make_unique<UdpServer>(port,[&r,&tp](int sockfd,const std::string&message,InetAddr& peer){
        task_t t=std::bind(&Route::MessageRoute,&r,sockfd,message,peer);
        //这个任务用的是r对象中的MessageRoute函数，并且将sockfd,message,peer传进去
        tp->Enqueue(t);
    });


    //构建一个服务器
    //将回调函数传进去
    // std::unique_ptr<UdpServer> usvr=std::make_unique<UdpServer>(port,[&r](int sockfd,const std::string&message,InetAddr& peer){
    //     r.MessageRoute(sockfd,message,peer);//收到消息后就将消息路由出去
    // });//创建服务器的时候将ip和端口传过去
    usvr->Init();//服务器初始化
    usvr->Start();//服务器启动
    return 0;
} 